#!/usr/bin/python
#coding:utf-8
'''
文本数据图片显示，逗号分隔txt,文件名为标题，第一行为列名
'''

import os
import pandas as pd
import numpy as np

from tkinter import *
from tkinter import ttk
from tkinter import filedialog

import pltUtil

urlList={"性别和年龄":"D:\\python-space\\2019\\pyServer\\check\\ageTime.txt","gpu":"D:/python-space/2019/pyServer/check/processingTime/gpu.txt","cpu":"D:/python-space/2019/pyServer/check/processingTime/cpu.txt"}

keyList=[]
for key in urlList:
    keyList.append(key)

curPath = os.path.abspath(os.path.dirname(__file__))
fontSize=10
startRow=1

class show():
    def __init__(self, root,log):
        '''
        初始化类
        '''
        self.log=log
        self.root=root
        self.control=Frame(self.root,bg='#F0F0F0')
        
        #头部
        self.top =Frame(self.control)
        self.topLayout()

        #left-左边
        self.fm2_left=Frame(self.control)
        self.lineType()
        self.fm2_left.pack(side=LEFT,expand=YES)

        #right 右边
        fm2_right=Frame(self.control)
        self.btnSend=Button(fm2_right,text='显示',font=('微软雅黑',fontSize),width='10',command=self.deal)
        self.btnSend.pack()
        fm2_right.pack(side=RIGHT,expand=YES)

        self.control.pack(side=TOP,expand=YES)

        # 输出框
        fm3=Frame(self.root)
        self.txtMsg = Text(fm3)
        self.txtMsg.pack(side=BOTTOM,pady=40,padx=20,fill="x")
        fm3.pack(side=BOTTOM,fill="x")

    
    def topLayout(self):
        '''
        头部
        '''
        num=self.getRowNum()
        Label(self.top,text='图形类型:',font=('微软雅黑',fontSize),width='10').grid(row=num,pady=10)
        self.showType = IntVar()  #管理单选按钮
        Radiobutton(self.top,variable=self.showType,text="折线图",font=('微软雅黑',fontSize),width='20',value=-1,command=lambda:self.callShowType(-1)).grid(row=num,column=1,sticky=W)
        Radiobutton(self.top,variable=self.showType,text="饼状图",font=('微软雅黑',fontSize),width='20',value=0,command=lambda:self.callShowType(0)).grid(row=num,column=2,sticky=W)
        self.showType.set(-1)
        self.top.pack(side=TOP,expand=YES)

        #选择文件
        num=self.getRowNum()
        Label(self.top,text='选择文件:',font=('微软雅黑',fontSize),width='10').grid(row=num,pady=10)
        self.iptParam=Entry(self.top,width='50',font=('微软雅黑',fontSize))
        self.iptParam.grid(row=num,column=1,columnspan=2,sticky=W)
        ttk.Button(self.top,text='选择',command=self.choseFile).grid(row=num,column=3,sticky=W,padx=1)

        #历史文件
        num=self.getRowNum()
        Label(self.top,text='历史文件:',font=('微软雅黑',fontSize),width='10').grid(row=num,pady=10)
        comvalue=StringVar()#窗体自带的文本，新建一个值
        self.CmbxUrl=ttk.Combobox(self.top,textvariable=comvalue,width='20')
        self.CmbxUrl["values"]=keyList
        # self.CmbxUrl.current(0)  #选择第一个
        self.CmbxUrl.bind("<<ComboboxSelected>>", self.boxSelect)
        self.CmbxUrl.grid(row=num,column=1,sticky=W)

        #left 第一行是否为列名
        num=self.getRowNum()
        Label(self.top,text='首行列名:',font=('微软雅黑',fontSize),width='10').grid(row=num,pady=10)
        self.firstRowName = IntVar()  #管理单选按钮
        Radiobutton(self.top,variable=self.firstRowName,text="是",font=('微软雅黑',fontSize),width='20',value=-1,command=lambda:self.call(self.firstRowName,-1)).grid(row=num,column=1,sticky=W)
        Radiobutton(self.top,variable=self.firstRowName,text="否",font=('微软雅黑',fontSize),width='20',value=0,command=lambda:self.call(self.firstRowName,0)).grid(row=num,column=2,sticky=W)
        self.firstRowName.set(-1)

    def getRowNum(self):
        '''
        获取行号
        '''
        global startRow
        startRow+=1
        return startRow

    def pieType(self):
        '''
        饼状图
        '''
        print("饼状图")
    
    def columnType(self):
        '''
        柱状图
        '''
        #left 输入列
        num=self.getRowNum()
        Label(self.fm2_left,text='数据列:',font=('微软雅黑',fontSize),width='10').grid(row=num,pady=10)
        self.columnNum=Entry(self.fm2_left,width='50',font=('微软雅黑',fontSize))
        self.columnNum.grid(row=num,column=1,columnspan=2,sticky=W)

    def lineType(self):
        '''
        折线图
        '''
        #left首列处理方式
        num=self.getRowNum()
        Label(self.fm2_left,text='首列处理:',font=('微软雅黑',fontSize),width='10').grid(row=num,pady=10)
        self.firstColumn = IntVar()  #管理单选按钮
        Radiobutton(self.fm2_left,variable=self.firstColumn,text="展示",font=('微软雅黑',fontSize),width='20',value=-1,command=lambda:self.call(self.firstColumn,-1)).grid(row=num,column=1,sticky=W)
        Radiobutton(self.fm2_left,variable=self.firstColumn,text="不展示",font=('微软雅黑',fontSize),width='20',value=0,command=lambda:self.call(self.firstColumn,0)).grid(row=num,column=2,sticky=W)
        Radiobutton(self.fm2_left,variable=self.firstColumn,text="横坐标",font=('微软雅黑',fontSize),width='20',value=1,command=lambda:self.call(self.firstColumn,1)).grid(row=num,column=3,sticky=W)
        self.firstColumn.set(-1)

        #left 输入列
        num=self.getRowNum()
        Label(self.fm2_left,text='数据列:',font=('微软雅黑',fontSize),width='10').grid(row=num,pady=10)
        self.columnNum=Entry(self.fm2_left,width='50',font=('微软雅黑',fontSize))
        self.columnNum.grid(row=num,column=1,columnspan=2,sticky=W)
    
    def choseFile(self):
        '''
        选择txt文件
        '''
        global curPath
        result=filedialog.askopenfilename(title='打开单个文件',filetypes=[("文本文件", "*.txt"), ('Python源文件', '*.py')], initialdir=curPath)
        if len(result)>0:
            self.iptParam.delete(0,END)
            self.iptParam.insert(0,result)
            curPath = os.path.dirname(curPath)
            self.txtMsg.insert(1.0,result+"\n")

    def boxSelect(self,*args):
        '''
        历史文件选择
        '''
        self.iptParam.delete(0,END)
        param=urlList.get(self.CmbxUrl.get())

        self.iptParam.insert(0,param)
    
    def call(self,model,value):
        '''
        类型选择：
            model：单选对象
            value：选择值
        '''
        model.set(value)
    
    def callRowName(self,value):
        '''
        第一列是否为列名
            -1：是
            0：否
        '''
        self.firstRowName.set(value)
    
    def callShowType(self,value):
        '''
        设置文件类型：
            折线图（默认），柱状图
        '''
        self.showType.set(value)
        self.clear(self.fm2_left)
        if value==-1: #折线图
            self.lineType()

        elif value==0: #柱状图
            self.columnType()
        self.iptParam.delete(0,END)
        # self.CmbxUrl.current(0)

    def clear(self,model):
        '''
        清空面板
        '''
        for widget in model.winfo_children():
            widget.destroy()
    
    def deal(self):
        '''
        数据展示
        '''
        file=self.iptParam.get()  #获取文件
        title=os.path.basename(file).split(".")[0]
        typeVule=self.showType.get()
        row=self.firstRowName.get() #第一行是否为列名
        columnStr=self.columnNum.get()
        if columnStr is not None and columnStr != "":
            columnValue=int(columnStr)  #取数据的列
        else:
            columnValue=-1
        print(columnValue)
        if typeVule==-1: #折线图
            data={}
            if row ==-1:  #第一行为列名
                df = pd.read_csv(file, header = 0)
                for i,column in enumerate(df):

                    if columnValue ==-1:
                        data[column]=[]
                    else:
                        if i ==columnValue:
                            data[column] =[]

            else:
                df = pd.read_csv(file, header =None ) 
                for i,column in enumerate(df):
                    if columnValue ==-1:
                        data[i+1]=[]
                    else:
                        if columnValue == i:
                            data[i+1]=[]

            
            for e in range(len(df.iloc[:,0])): #循环输出每一行
                if columnValue == -1:
                    for i,column in enumerate(data):
                        value=data.get(column)
                        value.append(df.iloc[e,i])
                        data[column]=value
                else:
                    for column in data:
                        value=data.get(column)
                        value.append(df.iloc[e,columnValue])
                        data[column]=value                    

            firstColumnState=self.firstColumn.get() # 第一列：-1：展示，0：不展示，1：横坐标
            pltUtil.showLine(data,title,firstColumnState)

        else: #柱状图
            if row ==-1: #第
                df = pd.read_csv(file, header = 0)
            else:
                df = pd.read_csv(file, header = None)
            
            data=[]
            for e in range(len(df.iloc[:,0])): #循环输出每一行
                data.append(df.iloc[e,columnValue])
            title+=" allSize:"+str(len(data))
            pltUtil.showColumn(data,title)

